package main

import (
	"fmt"
	"strings"
)

/*
1 1
2 1*2
3 1*2*3
4 1*2*3*4
5 1*2*3*4*5
*/
// 作业1：求n的阶乘。至少使用递归函数完成一次
func factorial(n int) int {
	if n <= 1 {
		return 1
	}
	num := 1
	for i := 1; i <= n; i++ {
		num = i * num
	}
	return num
}

func factRecursion(n int) int {
	if n <= 1 {
		return 1
	}
	return n * factRecursion(n-1)
}

func factRecursiveLoop(n, num int) int {
	if n <= 1 {
		return num
	}
	num = n * num
	return factRecursiveLoop(n-1, num)
}

// 作业2：编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐

func upper(n int) {
	for i := 1; i <= n; i++ {
		for j := n; j >= 1; j-- {
			if j >= 10 || j <= i {
				if j <= i {
					fmt.Printf("%d ", j)
				} else if j >= 10 {
					fmt.Printf("%s ", "  ")
				} else {
					fmt.Printf("%d ", j)
				}
			} else {
				fmt.Printf("%s ", " ")
			}
		}
		fmt.Println()
	}
}

func upper1(n int) {
	for i := 1; i <= n; i++ {
		if n < 9 {
			fmt.Print(strings.Repeat(" ", 2*(n-i)))
		} else {
			if i < 9 {
				fmt.Print(strings.Repeat(" ", 2*(n-i)+n-9))
			} else {
				fmt.Print(strings.Repeat(" ", 3*(n-i)))
			}
		}
		for j := i; j >= 1; j-- {
			fmt.Printf("%d ", j)
		}
		fmt.Println()
	}
}

func main() {
	fmt.Println(factorial(10))     // 循环方式
	fmt.Println(factRecursion(10)) // 递归方式
	fmt.Println(factRecursiveLoop(10, 1))
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// upper(12)  //作业2 方法1   （支持 n<100）
	upper1(12) //作业2 方法2   （支持 n<100）
}


// 批改意见
// 1. 阶乘如果考虑n<=1的情况，则需要考虑n<=0时抛出异常并给出提示